package framework.elements;

import static org.testng.AssertJUnit.assertEquals;
import java.util.Random;
import org.openqa.selenium.By;

/**
 * Класс, описывающий чекбокс
 */
public class CheckBox extends BaseElement {

	public CheckBox(final By locator, final String name) {
		super(locator, name);
	}

	protected String getElementType() {
		return "Чекбокс";
	}

	/**
	 * Проверка значения чекбокса При неверном значении тест прекращает работу
	 * 
	 * @param expectedState
	 *            Ожидаемое значение
	 */
	public void assertState(boolean expectedState) {
		assertEquals(
				formatLogMsg("Недопустимое значение для состояния чекбокса"),
				expectedState, isChecked());
	}

	/**
	 * Установка чекбокса в true
	 */
	public void check() {
		check(true);
	}

	/**
	 * Установить указанное значение
	 * 
	 * @param state
	 *            Значение (true/false)
	 */
	public void check(boolean state) {
		assertIsPresent();
		info(String.format("Устанавливаемое значение '%1$s'", state));
		if (!(state == true && element.isSelected())) {
			element.click();
		}
	}

	/**
	 * Установить рандомное значение
	 * 
	 * @return Установленное значение
	 */
	public boolean checkRandom() {
		boolean state = new Random().nextBoolean();
		check(state);
		return state;
	}

	/**
	 * Получить значение чекбокса (true/false)
	 */
	public boolean isChecked() {
		assertIsPresent();
		return element.isSelected();
	}

	/**
	 * Изменить значение чекбокса на противоположное
	 */
	public void toggle() {
		check(!isChecked());
	}

	/**
	 * Установка чекбокса в false
	 */
	public void uncheck() {
		check(false);
	}
}
